package org.xx.armory.spring5.mq;

import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 消息队列。
 */
public interface MessageQueue {
    /**
     * 产生一个新消息。
     *
     * @param producer
     *         消息生成器。
     * @return 是否成功产生了一个新消息。
     * @throws NullPointerException
     *         如果参数 {@code producer} 是 {@code null} 。
     */
    boolean produce(
            Supplier<Long> producer
    );

    /**
     * 消费一个消息。
     *
     * @param consumer
     *         消息消费器。
     * @param readTimeout
     *         读取消息的超时秒数。
     * @param messageTimeout
     *         消息的有效秒数。
     * @return 是否成功消费了一个消息。
     * @throws NullPointerException
     *         如果参数 {@code consumer} 是 {@code null} 。
     * @throws MessageTimeoutException
     *         如果从队列中读取的消息已过时。
     */
    boolean consume(
            Function<MessageQueueId, Boolean> consumer,
            int readTimeout,
            int messageTimeout
    );

    /**
     * 重置消息队列。
     * <strong>所有未消费的消息都会被删除！用于运行单元测试。</strong>
     */
    void reset();
}
